"""
核心思路
滑动窗口+计数技巧：通过扩展字符串（s + s[:-1]）来模拟所有可能的循环移位情况
两种交替模式：考虑以'0'开头和以'1'开头的两种交替模式
高效统计：维护一个计数器，跟踪当前窗口内需要翻转的字符数
"""
class Solution:
    def minFlips(self, s: str) -> int:
        # 初始化结果为字符串长度（最坏情况需要翻转所有字符）
        ans = n = len(s)
        # 计数器，记录当前窗口内需要翻转的字符数
        cnt = 0

        # 遍历扩展后的字符串（s + s[:-1]），共2n-1个字符
        # 这样可以覆盖所有可能的循环移位情况
        for i in range(n * 2 - 1):
            # 检查当前字符是否符合交替模式
            # 我们隐式检查两种模式：
            # 1. 模式1：偶数位应为'0'（i%2==0 → s[i]应为'0'）
            # 2. 模式2：偶数位应为'1'（i%2==0 → s[i]应为'1'）
            # 这里通过ord(s[i%n])%2 != i%2统一处理两种模式
            if ord(s[i % n]) % 2 != i % 2:
                cnt += 1  # 需要翻转

            # 当窗口大小达到n时开始计算最小翻转次数
            left = i - n + 1  # 窗口左边界
            if left < 0:
                continue  # 窗口大小不足n，跳过

            # 更新最小翻转次数：
            # 1. cnt：当前窗口内需要翻转的次数（对应一种交替模式）
            # 2. n - cnt：另一种交替模式需要的翻转次数
            ans = min(ans, cnt, n - cnt)

            # 滑动窗口左边界右移，调整计数器
            if ord(s[left]) % 2 != left % 2:
                cnt -= 1  # 移出的字符原本需要翻转，现在移出窗口

        return ans